home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Magazine / YAM / Source / includes / xpk / xpk.h
C/C++ Source or Header  |  2000-12-15  |  17KB  |  387 lines

  1. #ifndef XPK_XPK_H
  2. #define XPK_XPK_H
  3.  
  4. /*
  5. **    $VER: xpk/xpk.h 4.19 (28.10.1998) by SDI
  6. **
  7. **    (C) Copyright 1991-1998 by 
  8. **          Urban Dominik Mueller, Bryan Ford,
  9. **          Christian Schneider, Christian von Roques,
  10. **        Dirk Stöcker
  11. **        All Rights Reserved
  12. */
  13.  
  14. #ifndef EXEC_LIBRARIES_H
  15.   #include <exec/libraries.h>
  16. #endif
  17.  
  18. #ifndef EXEC_LISTS_H
  19.   #include <exec/lists.h>
  20. #endif
  21.  
  22. #ifndef UTILITY_TAGITEM_H
  23.   #include <utility/tagitem.h>
  24. #endif
  25.  
  26. #ifndef UTILITY_HOOKS_H
  27.   #include <utility/hooks.h>
  28. #endif
  29.  
  30. #define XPKNAME "xpkmaster.library"
  31.  
  32. /***************************************************************************
  33.  *
  34.  *
  35.  *      The packing/unpacking tags
  36.  *
  37.  * (TRUE) or (FALSE) mean the default value given by xpkmaster.library
  38.  *
  39.  */
  40.  
  41. #define XPK_TagBase    (TAG_USER + ('X'<<8) + 'P')
  42. #define XTAG(a)        (XPK_TagBase+a)
  43.  
  44. /* Caller must supply ONE of these to tell Xpk#?ack where to get data from */
  45. #define XPK_InName      XTAG(0x01) /* Process an entire named file */
  46. #define XPK_InFH      XTAG(0x02) /* File handle - start from current position */
  47.                      /* If packing partial file, must also supply InLen */
  48. #define XPK_InBuf      XTAG(0x03) /* Single unblocked memory buffer */
  49.                      /* Must also supply InLen */
  50. #define XPK_InHook      XTAG(0x04) /* Call custom Hook to read data */
  51.                      /* Must also supply InLen, when hook
  52.                         cannot do! (not for XPK unpacking) */
  53.  
  54. /* Caller must supply ONE of these to tell Xpk#?ackFile where to send data to */
  55. #define XPK_OutName      XTAG(0x10) /* Write (or overwrite) this data file */
  56. #define XPK_OutFH      XTAG(0x11) /* File handle - write from current position on */
  57. #define XPK_OutBuf      XTAG(0x12) /* Unblocked buffer - must also supply OutBufLen */
  58. #define XPK_GetOutBuf      XTAG(0x13) /* Master allocates OutBuf - ti_Data points to buf ptr */
  59. #define XPK_OutHook      XTAG(0x14) /* Callback Hook to get output buffers */
  60.  
  61. /* Other tags for Pack/Unpack */
  62. #define XPK_InLen      XTAG(0x20) /* Length of data in input buffer  */
  63. #define XPK_OutBufLen      XTAG(0x21) /* Length of output buffer         */
  64. #define XPK_GetOutLen      XTAG(0x22) /* ti_Data points to long to receive OutLen    */
  65. #define XPK_GetOutBufLen  XTAG(0x23) /* ti_Data points to long to receive OutBufLen */
  66. #define XPK_Password      XTAG(0x24) /* Password for de/encoding        */
  67. #define XPK_GetError      XTAG(0x25) /* ti_Data points to buffer for error message  */
  68. #define XPK_OutMemType      XTAG(0x26) /* Memory type for output buffer   */
  69. #define XPK_PassThru      XTAG(0x27) /* Bool: Pass through unrecognized formats on unpack */
  70. #define XPK_StepDown      XTAG(0x28) /* Bool: Step down pack method if necessary    */
  71. #define XPK_ChunkHook      XTAG(0x29) /* Call this Hook between chunks   */
  72. #define XPK_PackMethod      XTAG(0x2a) /* Do a FindMethod before packing  */
  73. #define XPK_ChunkSize      XTAG(0x2b) /* Chunk size to try to pack with  */
  74. #define XPK_PackMode      XTAG(0x2c) /* Packing mode for sublib to use  */
  75. #define XPK_NoClobber      XTAG(0x2d) /* Don't overwrite existing files  */
  76. #define XPK_Ignore      XTAG(0x2e) /* Skip this tag                   */
  77. #define XPK_TaskPri      XTAG(0x2f) /* Change priority for (un)packing */
  78. #define XPK_FileName      XTAG(0x30) /* File name for progress report   */
  79. #define XPK_ShortError      XTAG(0x31) /* !!! obsolete !!!                */
  80. #define XPK_PackersQuery  XTAG(0x32) /* Query available packers         */
  81. #define XPK_PackerQuery      XTAG(0x33) /* Query properties of a packer    */
  82. #define XPK_ModeQuery      XTAG(0x34) /* Query properties of packmode    */
  83. #define XPK_LossyOK      XTAG(0x35) /* Lossy packing permitted? (FALSE)*/
  84. #define XPK_NoCRC         XTAG(0x36) /* Ignore checksum                 */
  85. /* tags added for xfdmaster support (version 4 revision 25) */
  86. #define XPK_Key16      XTAG(0x37) /* 16 bit key (unpack only)    */
  87. #define XPK_Key32      XTAG(0x38) /* 32 bit key (unpack only)    */
  88.  
  89. /* tag added to support seek (version 5) */
  90. #define XPK_NeedSeek      XTAG(0x39) /* turn on Seek function usage    */
  91.  
  92. /* preference depending tags added for version 4 - their default value
  93.  may depend on preferences, see <xpk/xpkprefs.h> for more info */
  94.  
  95. #define XPK_UseXfdMaster  XTAG(0x40) /* Use xfdmaster.library (FALSE)   */
  96. #define XPK_UseExternals  XTAG(0x41) /* Use packers in extern dir (TRUE)*/
  97. #define XPK_PassRequest   XTAG(0x42) /* automatic password req.? (FALSE)*/
  98. #define XPK_Preferences   XTAG(0x43) /* use prefs semaphore ? (TRUE)    */
  99. #define XPK_ChunkReport      XTAG(0x44) /* automatic chunk report ? (FALSE)*/
  100.  
  101. /* tags XTAG(0x50) to XTAG(0x6F) are for XpkPassRequest -- see below */
  102.  
  103. #define XPK_MARGIN    256    /* Safety margin for output buffer    */
  104.  
  105. /***************************************************************************
  106.  *
  107.  *
  108.  *     The hook function interface
  109.  *
  110.  */
  111.  
  112. /* Message passed to InHook and OutHook as the ParamPacket */
  113. struct XpkIOMsg {
  114.     ULONG xiom_Type        ; /* Read/Write/Alloc/Free/Abort    */
  115.     APTR  xiom_Ptr        ; /* The mem area to read from/write to */
  116.     LONG  xiom_Size        ; /* The size of the read/write        */
  117.     ULONG xiom_IOError    ; /* The IoErr() that occurred        */
  118.     ULONG xiom_Reserved    ; /* Reserved for future use        */
  119.     ULONG xiom_Private1    ; /* Hook specific, will be set to 0 by */
  120.     ULONG xiom_Private2    ; /* master library before first use    */
  121.     ULONG xiom_Private3    ;
  122.     ULONG xiom_Private4    ;
  123. };
  124.  
  125. /* The values for XpkIoMsg->Type */
  126. #define XIO_READ    1
  127. #define XIO_WRITE   2
  128. #define XIO_FREE    3
  129. #define XIO_ABORT   4
  130. #define XIO_GETBUF  5
  131. #define XIO_SEEK    6
  132. #define XIO_TOTSIZE 7
  133.  
  134. /***************************************************************************
  135.  *
  136.  *
  137.  *      The progress report interface
  138.  *
  139.  */
  140.  
  141. /* Passed to ChunkHook as the ParamPacket */
  142. struct XpkProgress {
  143.   ULONG     xp_Type;        /* Type of report: XPKPROG_#? numbers      */
  144.   STRPTR xp_PackerName;     /* Brief name of packer being used           */
  145.   STRPTR xp_PackerLongName; /* Descriptive name of packer being used       */
  146.   STRPTR xp_Activity;       /* Packing/unpacking message          */
  147.   STRPTR xp_FileName;       /* Name of file being processed, if available */
  148.   ULONG     xp_CCur;           /* Amount of packed data already processed      */
  149.   ULONG     xp_UCur;           /* Amount of unpacked data already processed  */
  150.   ULONG     xp_ULen;        /* Amount of unpacked data in file          */
  151.   LONG     xp_CF;            /* Compression factor so far          */
  152.   ULONG     xp_Done;           /* Percentage done already              */
  153.   ULONG     xp_Speed;          /* Bytes per second, from beginning of stream */
  154.   ULONG     xp_Reserved[8];    /* For future use                  */
  155. };
  156. #define XPKPROG_START    1    /* crunching started */
  157. #define XPKPROG_MID    2    /* somewhere in the mid */
  158. #define XPKPROG_END    3    /* crunching is completed */
  159.  
  160. /***************************************************************************
  161.  *
  162.  *
  163.  *       The file info block
  164.  *
  165.  */
  166.  
  167. struct XpkFib {
  168.     ULONG    xf_Type        ; /* Unpacked, packed, archive?   */
  169.     ULONG    xf_ULen        ; /* Uncompressed length          */
  170.     ULONG    xf_CLen        ; /* Compressed length            */
  171.     ULONG    xf_NLen        ; /* Next chunk len               */
  172.     ULONG    xf_UCur        ; /* Uncompressed bytes so far    */
  173.     ULONG    xf_CCur        ; /* Compressed bytes so far      */
  174.     ULONG    xf_ID        ; /* 4 letter ID of packer        */
  175.     UBYTE    xf_Packer[6]    ; /* 4 letter name of packer      */
  176.     UWORD    xf_SubVersion    ; /* Required sublib version      */
  177.     UWORD    xf_MasVersion    ; /* Required masterlib version   */
  178.     ULONG    xf_Flags    ; /* Password?                    */
  179.     UBYTE    xf_Head[16]    ; /* First 16 bytes of orig. file */
  180.     LONG    xf_Ratio    ; /* Compression ratio            */
  181.     ULONG    xf_Reserved[8]    ; /* For future use               */
  182. };
  183.  
  184. #define XPKTYPE_UNPACKED 0        /* Not packed                   */
  185. #define XPKTYPE_PACKED   1        /* Packed file                  */
  186. #define XPKTYPE_ARCHIVE  2        /* Archive                      */
  187.  
  188. #define XPKFLAGS_PASSWORD (1<< 0) /* Password needed              */
  189. #define XPKFLAGS_NOSEEK   (1<< 1) /* Chunks are dependent         */
  190. #define XPKFLAGS_NONSTD   (1<< 2) /* Nonstandard file format      */
  191. /* defines added for xfdmaster support (version 4 revision 25) */
  192. #define XPKFLAGS_KEY16      (1<< 3) /* 16 bit key - for decrunching */
  193. #define XPKFLAGS_KEY32      (1<< 4) /* 32 bit key - for decrunching */
  194.  
  195. /***************************************************************************
  196.  *
  197.  *
  198.  *       The error messages
  199.  *
  200.  */
  201.  
  202. #define XPKERR_OK      0
  203. #define XPKERR_NOFUNC       -1    /* This function not implemented    */
  204. #define XPKERR_NOFILES       -2    /* No files allowed for this function    */
  205. #define XPKERR_IOERRIN       -3    /* Input error happened            */
  206. #define XPKERR_IOERROUT       -4    /* Output error happened        */
  207. #define XPKERR_CHECKSUM       -5    /* Check sum test failed        */
  208. #define XPKERR_VERSION       -6    /* Packed file's version newer than lib */
  209. #define XPKERR_NOMEM       -7    /* Out of memory            */
  210. #define XPKERR_LIBINUSE       -8    /* For not-reentrant libraries        */
  211. #define XPKERR_WRONGFORM   -9    /* Was not packed with this library    */
  212. #define XPKERR_SMALLBUF       -10    /* Output buffer too small        */
  213. #define XPKERR_LARGEBUF       -11    /* Input buffer too large        */
  214. #define XPKERR_WRONGMODE   -12    /* This packing mode not supported    */
  215. #define XPKERR_NEEDPASSWD  -13    /* Password needed for decoding        */
  216. #define XPKERR_CORRUPTPKD  -14    /* Packed file is corrupt        */
  217. #define XPKERR_MISSINGLIB  -15    /* Required library is missing        */
  218. #define XPKERR_BADPARAMS   -16    /* Caller's TagList was screwed up    */
  219. #define XPKERR_EXPANSION   -17    /* Would have caused data expansion    */
  220. #define XPKERR_NOMETHOD    -18    /* Cannot find requested method        */
  221. #define XPKERR_ABORTED     -19    /* Operation aborted by user        */
  222. #define XPKERR_TRUNCATED   -20    /* Input file is truncated        */
  223. #define XPKERR_WRONGCPU    -21    /* Better CPU required for this library    */
  224. #define XPKERR_PACKED      -22    /* Data are already XPacked        */
  225. #define XPKERR_NOTPACKED   -23    /* Data not packed            */
  226. #define XPKERR_FILEEXISTS  -24    /* File already exists            */
  227. #define XPKERR_OLDMASTLIB  -25    /* Master library too old        */
  228. #define XPKERR_OLDSUBLIB   -26    /* Sub library too old            */
  229. #define XPKERR_NOCRYPT     -27    /* Cannot encrypt            */
  230. #define XPKERR_NOINFO      -28    /* Can't get info on that packer    */
  231. #define XPKERR_LOSSY       -29    /* This compression method is lossy    */
  232. #define XPKERR_NOHARDWARE  -30    /* Compression hardware required    */
  233. #define XPKERR_BADHARDWARE -31    /* Compression hardware failed        */
  234. #define XPKERR_WRONGPW     -32    /* Password was wrong            */
  235. #define XPKERR_UNKNOWN       -33    /* unknown error cause            */
  236. #define XPKERR_REQTIMEOUT  -34  /* password request reached time out    */
  237.  
  238. #define XPKERRMSGSIZE    80    /* Maximum size of an error message    */
  239.  
  240. /***************************************************************************
  241.  *
  242.  *
  243.  *     The XpkQuery() call
  244.  *
  245.  */
  246.  
  247. struct XpkPackerInfo {
  248.     UBYTE    xpi_Name[24]       ; /* Brief name of the packer          */
  249.     UBYTE    xpi_LongName[32]   ; /* Full name of the packer           */
  250.     UBYTE    xpi_Description[80]; /* One line description of packer    */
  251.     ULONG    xpi_Flags          ; /* Defined below                     */
  252.     ULONG    xpi_MaxChunk       ; /* Max input chunk size for packing  */
  253.     ULONG    xpi_DefChunk       ; /* Default packing chunk size        */
  254.     UWORD    xpi_DefMode        ; /* Default mode on 0..100 scale      */
  255. };
  256.  
  257. /* Defines for Flags */
  258. #define XPKIF_PK_CHUNK   (1<< 0) /* Library supplies chunk packing       */
  259. #define XPKIF_PK_STREAM  (1<< 1) /* Library supplies stream packing      */
  260. #define XPKIF_PK_ARCHIVE (1<< 2) /* Library supplies archive packing     */
  261. #define XPKIF_UP_CHUNK   (1<< 3) /* Library supplies chunk unpacking     */
  262. #define XPKIF_UP_STREAM  (1<< 4) /* Library supplies stream unpacking    */
  263. #define XPKIF_UP_ARCHIVE (1<< 5) /* Library supplies archive unpacking   */
  264. #define XPKIF_HOOKIO     (1<< 7) /* Uses full Hook I/O                   */
  265. #define XPKIF_CHECKING   (1<<10) /* Does its own data checking           */
  266. #define XPKIF_PREREADHDR (1<<11) /* Unpacker pre-reads the next chunkhdr */
  267. #define XPKIF_ENCRYPTION (1<<13) /* Sub library supports encryption      */
  268. #define XPKIF_NEEDPASSWD (1<<14) /* Sub library requires encryption      */
  269. #define XPKIF_MODES      (1<<15) /* Sub library has different XpkMode's  */
  270. #define XPKIF_LOSSY      (1<<16) /* Sub library does lossy compression   */
  271. #define XPKIF_NOSEEK     (1<<17) /* unpacker does not support seeking     */
  272.  
  273. struct XpkMode {
  274.   struct XpkMode *xm_Next;   /* Chain to next descriptor for ModeDesc list*/
  275.   ULONG   xm_Upto;         /* Maximum efficiency handled by this mode   */
  276.   ULONG   xm_Flags;         /* Defined below                             */
  277.   ULONG   xm_PackMemory;     /* Extra memory required during packing      */
  278.   ULONG   xm_UnpackMemory;   /* Extra memory during unpacking             */
  279.   ULONG   xm_PackSpeed;      /* Approx packing speed in K per second      */
  280.   ULONG   xm_UnpackSpeed;    /* Approx unpacking speed in K per second    */
  281.   UWORD   xm_Ratio;         /* CF in 0.1%                  */
  282.   UWORD   xm_ChunkSize;         /* Desired chunk size in K (!!) for this mode*/
  283.   UBYTE   xm_Description[10];/* 7 character mode description              */
  284. };
  285.  
  286. /* Defines for XpkMode.Flags */
  287. #define XPKMF_A3000SPEED (1<< 0) /* Timings on old standard environment */
  288.                  /* obsolete */
  289. #define XPKMF_PK_NOCPU   (1<< 1) /* Packing not heavily CPU dependent    */
  290. #define XPKMF_UP_NOCPU   (1<< 2) /* Unpacking... (i.e. hardware modes)    */
  291.  
  292. #define MAXPACKERS 100
  293.  
  294. struct XpkPackerList {
  295.     ULONG    xpl_NumPackers;
  296.     UBYTE    xpl_Packer[MAXPACKERS][6];
  297. };
  298.  
  299. /***************************************************************************
  300.  *
  301.  *
  302.  *     The XpkSeek() call (library version 5)
  303.  *
  304.  */
  305.  
  306. #define XPKSEEK_BEGINNING    -1
  307. #define XPKSEEK_CURRENT        0
  308. #define XPKSEEK_END        1
  309.  
  310. /***************************************************************************
  311.  *
  312.  *
  313.  *     The XpkPassRequest() call (library version 4)
  314.  *
  315.  */
  316.  
  317. #define XPK_PassChars      XTAG(0x50) /* which chars should be used */
  318. #define XPK_PasswordBuf   XTAG(0x51) /* buffer to write password to */
  319. #define XPK_PassBufSize   XTAG(0x52) /* size of password buffer */
  320. #define XPK_Key16BitPtr      XTAG(0x53) /* pointer to UWORD var for key data */
  321. #define XPK_Key32BitPtr      XTAG(0x54) /* pointer to ULONG var for key data */
  322. #define XPK_PubScreen      XTAG(0x55) /* pointer to struct Screen */
  323. #define XPK_PassTitle      XTAG(0x56) /* Text shown in Screen title */
  324. #define XPK_TimeOut      XTAG(0x57) /* Timeout time of requester in seconds */
  325. /* request position and verify tags (version 4 revision 25) */
  326. #define XPK_PassWinLeft      XTAG(0x58) /* distance from left screen border */
  327. #define XPK_PassWinTop      XTAG(0x59) /* distance form top screen border */
  328. #define XPK_PassWinWidth  XTAG(0x5A) /* width of requester window */
  329. #define XPK_PassWinHeight XTAG(0x5B) /* height of requester window */
  330. #define XPK_PassCenter    XTAG(0x5C) /* Left and Top are used as center coords */
  331. #define XPK_PassVerify      XTAG(0x5D) /* force user to verify password */
  332.  
  333. /* XPKPASSFF defines for XPK_PassChars. Do not use. Use XPKPASSFLG defines */
  334.  
  335. #define XPKPASSFF_30x39        (1<< 0)    /* all numbers        */
  336. #define XPKPASSFF_41x46        (1<< 1)    /* chars 'A' to 'F'    */
  337. #define XPKPASSFF_61x66        (1<< 2)    /* chars 'a' to 'f'    */
  338. #define XPKPASSFF_47x5A        (1<< 3)    /* chars 'G' to 'Z'    */
  339. #define XPKPASSFF_67x7A        (1<< 4)    /* chars 'g' to 'z'    */
  340. #define XPKPASSFF_20        (1<< 5)    /* space character    */
  341. #define XPKPASSFF_SPECIAL7BIT    (1<< 6) /* special 7 bit chars  */
  342.         /* all chars 0x20 to 0x7E without above defined */
  343.  
  344. #define XPKPASSFF_C0xDE        (1<< 7)    /* upper special chars    */
  345. #define XPKPASSFF_DFxFF        (1<< 8)    /* lower special chars    */
  346. #define XPKPASSFF_SPECIAL8BIT    (1<< 9)    /* special 8 bit chars    */
  347.         /* all chars 0xA0 to 0xBF */
  348.  
  349. /* Control characters (0x00 to 0x1F, 0x7F and 0x80 to 0x9F) are not
  350.  * useable. This also means carriage return, linefeed, tab stop and
  351.  * other controls are not usable.
  352.  */
  353.  
  354. /* flags for XPK_PassChars, XPKPASSFLG_PRINTABLE is default
  355.  *
  356.  * NUMERIC    : numbers
  357.  * HEXADECIMAL    : hex numbers
  358.  * ALPHANUMERIC    : numbers and letters
  359.  * INTALPHANUM    : numbers and international letters
  360.  * ASCII7    : 7 Bit ASCII
  361.  * PRINTABLE    : all printable characters
  362.  */
  363.  
  364. #define XPKPASSFLG_NUMERIC    XPKPASSFF_30x39
  365. #define XPKPASSFLG_HEXADECIMAL    (XPKPASSFF_30x39|XPKPASSFF_41x46|XPKPASSFF_61x66)
  366. #define XPKPASSFLG_ALPHANUMERIC    (XPKPASSFLG_HEXADECIMAL|XPKPASSFF_47x5A|XPKPASSFF_67x7A)
  367. #define XPKPASSFLG_INTALPHANUM    (XPKPASSFLG_ALPHANUMERIC|XPKPASSFF_C0xDE|XPKPASSFF_DFxFF)
  368. #define XPKPASSFLG_ASCII7    (XPKPASSFLG_ALPHANUMERIC|XPKPASSFF_SPECIAL7BIT)
  369. #define XPKPASSFLG_PRINTABLE    (XPKPASSFLG_INTALPHANUM|XPKPASSFF_SPECIAL7BIT|XPKPASSFF_SPECIAL8BIT|XPKPASSFF_20)
  370.  
  371. /***************************************************************************
  372.  *
  373.  *
  374.  *     The XpkAllocObject() call (library version 4)
  375.  *
  376.  * use this always with library version >= 4, do NO longer allocate the
  377.  * structures yourself
  378.  *
  379.  */
  380.  
  381. #define XPKOBJ_FIB        0    /* XpkFib structure */
  382. #define XPKOBJ_PACKERINFO    1    /* XpkPackerInfo structure */
  383. #define XPKOBJ_MODE        2    /* XpkMode structure */
  384. #define XPKOBJ_PACKERLIST    3    /* XpkPackerList structure */
  385.  
  386. #endif /* XPK_XPK_H */
  387.